/***************************************************
 @Name :        1196kk0
 @Time :        2025-05-26
 @Email :       2232506563@qq.com
 @Comment :     串口初始化及中断配置
 @FileName :    drv_USART.c
 @Version :     4.0
****************************************************/

#include "drv_USART.h"

/***************************************
函数名：drv_USART6_Config
函数功能：串口6初始化   下载接口    串口打印printf
输入参数：无
输出参数：无
其它：//PG9->USART6_RX   
	  //PG14->USART6_TX
	  波特率115200
****************************************/
void drv_USART6_Config(void)
{
    //定义结构体
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    //开启时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG , ENABLE);      //开启GPIOG的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6 , ENABLE);     //开启串口6的时钟

    //配置GPIO
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;               //设置为复用模式
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;             //推挽输出
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;               //上拉
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;          //速率50MHz
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_14;    //串口引脚
    GPIO_Init(GPIOG , &GPIO_InitStruct);    

    //配置复用
    GPIO_PinAFConfig(GPIOG , GPIO_PinSource9 , GPIO_AF_USART6);
    GPIO_PinAFConfig(GPIOG , GPIO_PinSource14 , GPIO_AF_USART6);

    //配置串口
    USART_InitStruct.USART_BaudRate = 115200;                                       //115200波特率
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    //无硬件流控
    USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;                      //开启接收和发送模式
    USART_InitStruct.USART_Parity = USART_Parity_No;                                //没有校验位
    USART_InitStruct.USART_StopBits = USART_StopBits_1;                             //1位停止位
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;                        //8位数据位
    USART_Init(USART6 , &USART_InitStruct);

    
    USART_ITConfig(USART6 , USART_IT_RXNE , ENABLE);
    USART_ITConfig(USART6 , USART_IT_IDLE , ENABLE);
    //配置中断
    NVIC_InitStruct.NVIC_IRQChannel = USART6_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    USART_ClearFlag(USART6 , USART_FLAG_TC);    //清空发送完成标志，否则会丢失第一个字母
    USART_Cmd(USART6 , ENABLE);
}

/***************************************
函数名：fputc
函数功能：重写fputc     使用printf打印
输入参数：字符ch、文件指针*f
输出参数：无
其它:
****************************************/
int fputc(int ch , FILE *f)
{
    USART_SendData(USART6 , ch);
    while(USART_GetFlagStatus(USART6 , USART_FLAG_TC) == RESET);    //等待发送完成
    USART_ClearFlag(USART6 , USART_FLAG_TC);                        //清空发送完成标志
    return 0;
}

/***************************************
函数名：drv_USART2_Config
函数功能：串口2初始化   天问五幺语音模块串口配置
输入参数：无
输出参数：无
其它：//PA3->USART2_RX   
	  //PA2->USART2_TX
	  波特率9600
****************************************/
void drv_USART2_Config(void)
{
    //定义结构体
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    //开启时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);      //开启GPIOA的时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);     //开启串口2的时钟

    //配置GPIO
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;               //设置为复用模式
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;             //推挽输出
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;               //上拉
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;          //速率50MHz
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;    //串口引脚
    GPIO_Init(GPIOA , &GPIO_InitStruct);    

    //配置复用
    GPIO_PinAFConfig(GPIOA , GPIO_PinSource2 , GPIO_AF_USART2);
    GPIO_PinAFConfig(GPIOA , GPIO_PinSource3 , GPIO_AF_USART2);

    //配置串口
    USART_InitStruct.USART_BaudRate = 9600;                                       //115200波特率
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    //无硬件流控
    USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;                      //开启接收和发送模式
    USART_InitStruct.USART_Parity = USART_Parity_No;                                //没有校验位
    USART_InitStruct.USART_StopBits = USART_StopBits_1;                             //1位停止位
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;                        //8位数据位
    USART_Init(USART2 , &USART_InitStruct);

    
    USART_ITConfig(USART2 , USART_IT_RXNE , ENABLE);
    //配置中断
    NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    USART_ClearFlag(USART2 , USART_FLAG_TC);    //清空发送完成标志，否则会丢失第一个字母
    USART_Cmd(USART2 , ENABLE);
}

/***************************************
函数名：drv_USART3_Config
函数功能：串口3初始化   ESP-12F WIFI模块串口配置
输入参数：无
输出参数：无
其它：//PB11->USART3_RX   
	  //PB10->USART3_TX
	  波特率115200
****************************************/
void drv_USART3_Config(void)
{
    //定义结构体
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    //开启时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);      //开启GPIOB的时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 , ENABLE);     //开启串口3时钟

    //配置GPIO
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;               //设置为复用模式
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;             //推挽输出
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;               //上拉
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;          //速率50MHz
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;    //串口引脚
    GPIO_Init(GPIOB , &GPIO_InitStruct);    

    //配置复用
    GPIO_PinAFConfig(GPIOB , GPIO_PinSource10 , GPIO_AF_USART3);
    GPIO_PinAFConfig(GPIOB , GPIO_PinSource11 , GPIO_AF_USART3);

    //配置串口
    USART_InitStruct.USART_BaudRate = 115200;                                       //115200波特率
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    //无硬件流控
    USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;                      //开启接收和发送模式
    USART_InitStruct.USART_Parity = USART_Parity_No;                                //没有校验位
    USART_InitStruct.USART_StopBits = USART_StopBits_1;                             //1位停止位
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;                        //8位数据位
    USART_Init(USART3 , &USART_InitStruct);

    USART_ITConfig(USART3 , USART_IT_RXNE , ENABLE);
    //配置中断
    NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    USART_ClearFlag(USART3 , USART_FLAG_TC);    //清空发送完成标志，否则会丢失第一个字母
    USART_Cmd(USART3 , ENABLE);
}

/***************************************
函数名：USART_Send_str
函数功能：串口发送字符串
输入参数：串口号USART、字符串str、字符串大小size
输出参数：无
其它：
****************************************/
void USART_Send_str(USART_TypeDef * USART , char * str , int size)
{
    uint8_t i = 0;
    USART_ClearFlag(USART , USART_FLAG_TC);
    for ( i = 0; i < size; i++)
    {
        USART_SendData(USART , *str);
        while(USART_GetFlagStatus(USART , USART_FLAG_TC) == RESET);
        USART_ClearFlag(USART , USART_FLAG_TC);
        str++;
    }
}


